package com.eshop.config.thread;

import com.eshop.utils.SpringContextHolder;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * ThreadPoolExecutorUtil 类提供了一个静态方法 getPoll()，用于根据配置信息创建并返回一个 ThreadPoolExecutor 实例。
 *
 * 首先，通过 SpringContextHolder.getBean(Class) 方法从Spring IoC容器中获取 AsyncTaskProperties 类型的bean实例。AsyncTaskProperties 类通常包含线程池的核心线程数、最大线程数、线程存活时间、队列容量等配置属性。
 *
 * 使用获取到的 AsyncTaskProperties 实例的属性，初始化一个 ThreadPoolExecutor：
 *
 * corePoolSize：核心线程数，即线程池中始终维持的最小线程数量。
 * maxPoolSize：最大线程数，线程池能容纳的最大线程数量，超过核心线程数时才会创建。
 * keepAliveSeconds：线程空闲时间（单位为秒），超过这个时间无任务执行的线程将会被终止，直到线程数量达到核心线程数。
 * TimeUnit.SECONDS：线程存活时间单位。
 * new ArrayBlockingQueue<>(properties.getQueueCapacity())：创建一个阻塞队列，用于存放待执行的任务，队列容量由配置决定。
 * new TheadFactoryName()：提供一个自定义的 ThreadFactory 实例，用于创建具有特定名称前缀的线程。
 * 最终，这个方法返回根据以上配置初始化好的 ThreadPoolExecutor 实例，应用程序可以通过调用该方法来获取并使用线程池执行异步任务。
 */
public class ThreadPoolExecutorUtil
{
    public static ThreadPoolExecutor getPoll() {
        final AsyncTaskProperties properties = (AsyncTaskProperties)SpringContextHolder.getBean((Class)AsyncTaskProperties.class);
        return new ThreadPoolExecutor(properties.getCorePoolSize(), properties.getMaxPoolSize(), properties.getKeepAliveSeconds(), TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(properties.getQueueCapacity()), new TheadFactoryName());
    }
}
